Skip to content

Instantly share code, notes, and snippets.

View developerfromjokela's full-sized avatar
🪒
tinkering

DFJ developerfromjokela

🪒
tinkering
View GitHub Profile
@developerfromjokela
developerfromjokela / index.php
Created October 17, 2025 20:03
Calendar app for OpenCARWINGS via datachannel
<?php
// Handle POST request with timezone data
$postData = null;
$timezoneOffset = 3; // Default EEST offset in hours
$userTimezone = 'Europe/Helsinki'; // Default timezone
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$postJson = file_get_contents('php://input');
$postData = json_decode($postJson, true);
@developerfromjokela
developerfromjokela / index.php
Last active October 17, 2025 19:28
Nordpool market price for OpenCARWINGS
<?php
// Handle POST request with timezone data
$postData = null;
$timezoneOffset = 3; // Default EEST offset in hours
$userTimezone = 'Europe/Helsinki'; // Default timezone
$zone = "FI";
$vat = 1.255;
if (isset($_GET['z'])) {
@developerfromjokela
developerfromjokela / libbs.cpp
Created September 16, 2025 20:32
Full utility in C++ for converting Xanavi/Clarion/NissanLeaf map Mesh IDs (including encoded ones)
#include "libbs.h"
#include <stdint.h>
#include <cstdint>
#include <cstdio>
#include <sys/types.h>
/*
* "MonsterID" is encoded Mesh ID composed for charging station updates, so far used only for CarWings CP updates
*/
int32_t UnpackMonsterIDIntoMeshID(int32_t monsterId)
@developerfromjokela
developerfromjokela / nksum.py
Created May 8, 2025 11:16
Calculate NK update file SUM, Xanavi/Clarion 72xx
import argparse
def compute_checksum_and_verify(data: bytes) -> bool:
data_array = bytearray(data)
checksum_offset = 0x30
# Read and temporarily clear the stored checksum for region 0
original_checksum = int.from_bytes(data_array[checksum_offset:checksum_offset+2], byteorder='little')
data_array[checksum_offset:checksum_offset+2] = [0, 0]
# Calculate checksum by summing all bytes
@developerfromjokela
developerfromjokela / configuration.yaml
Created April 30, 2025 13:21
OpenCARWINGS Home Assistant template, add this to yoru configuration
template:
- binary_sensor:
- name: "EV Charging"
unique_id: ev_charging
device_class: battery_charging
state: >
{{ state_attr('sensor.ev_raw_data', 'ev_info').charging }}
- name: "EV Quick Charging"
unique_id: ev_qc_charging
device_class: battery_charging
@developerfromjokela
developerfromjokela / main.py
Created February 16, 2025 20:49
KWP extract
import sys
import struct
def extract_firmware(input_file, output_file):
DEFAULT_OUTPUT_SIZE = 300 * 1024 * 1024 # 1MB
total_bytes_extracted = 0
try:
with open(input_file, "rb") as infile:
@developerfromjokela
developerfromjokela / laskuri.py
Last active July 25, 2023 17:50
Wilma opintopiste laskuri
import requests
# Wilma2SID= cookie value here
SESSION = ""
# Your Wilma Base URL
BASEURL = "https://example.inschool.fi/!0249962/"
# Schedule ID as ENV if you know already, otherwise select using CLI
SCHEDULE = os.environ.get("SCHEDULE", '')
@developerfromjokela
developerfromjokela / parse.js
Created June 27, 2021 23:15
Parse Wilma Course Tray schedule generator
const {parseData} = require('./utils');
let jsonConf = "{\"others\":[{\"data\":\"1,585,75\",\"text\":\"vENA11.1, tukikurssi\"},{\"data\":\"1,670,105\",\"text\":\"vSAA05.1\"},{\"data\":\"1,785,75\",\"text\":\"vMAA05.3\"},{\"data\":\"1,870,75\",\"text\":\"vYH02.3\"},{\"data\":\"2,585,75\",\"text\":\"vSAA05.1\"},{\"data\":\"2,670,105\",\"text\":\"vÄI04.2\"},{\"data\":\"2,870,75\",\"text\":\"vOP06.3, HYK20C, klo 13.05-13.20\"},{\"data\":\"3,495,75\",\"text\":\"vYH02.3\"},{\"data\":\"3,585,75\",\"text\":\"vÄI04.2\"},{\"data\":\"3,670,105\",\"text\":\"vENA11.1, tukikurssi\"},{\"data\":\"4,585,75\",\"text\":\"vMAA05.3\"},{\"data\":\"4,670,105\",\"text\":\"vSAA05.1\"},{\"data\":\"4,785,75\",\"text\":\"vYH02.3\"},{\"data\":\"5,585,75\",\"text\":\"vENA11.1, tukikurssi\"},{\"data\":\"5,670,105\",\"text\":\"vMAA05.3\"},{\"data\":\"5,785,75\",\"text\":\"vÄI04.2\"}],\"checksum\":\"CE2089E\"}";
jsonConf = JSON.parse(jsonConf);
let multiplier = 1;
let globalItems = [];
jsonConf.others.forEach(item => {
let items = pars
@developerfromjokela
developerfromjokela / abitti_versionscan.py
Last active May 26, 2021 22:35
Scan all abitti versions and save them to a file
import json
from datetime import datetime
import remotezip
import requests
versionList = []
versions = {
"ktp": [],
"koe": []
#include <Servo.h>
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
}
void loop() {