Skip to content

Instantly share code, notes, and snippets.

View ramonsmits's full-sized avatar

Ramon Smits ramonsmits

View GitHub Profile
@ramonsmits
ramonsmits / ChargeOrchestrator.cs
Created January 23, 2023 16:53
ChargeOrchestrator
using System.Globalization;
using Microsoft.Extensions.Logging;
using MQTTnet;
class ChargeOrchestrator
{
const double PackSizeRemainingAtFull = 85000; // kWh
readonly ILogger<ChargeOrchestrator> logger;
readonly IMessagePublisher messagePublisher;
@ramonsmits
ramonsmits / DsmrReaderTeslaMateLoadBalancer.cs
Last active January 16, 2023 11:54
Tesla charging load balancer based on events from DSMR Reader and TeslaMate
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using MQTTnet;
class DsmrTeslaLoadBalancer
@ramonsmits
ramonsmits / emoji.md
Last active December 9, 2022 08:22
Emoji

🐛 ✨ 📦 🚨 ✔️❌ ✅❎ ⚙️ 🔧 🚨 📚

@ramonsmits
ramonsmits / water-meter.yml
Created October 4, 2022 11:46
ESPHome ESP32 water meter
# originally based on https://www.huizebruin.nl/home-assistant/esphome/watermeter-uitlezen-in-home-assistant-met-esphome
#
# Differences:
# - Uses MQTT.
# - Uses internal_filter: 250ms to skip short pulses due to "floating pin"
# voltage. Measure your minimum pulse time by opening several taps in your
# home and count the number of pulse in 30 seconds and you can calculate the
# minimum pulse duration. If you set this value just under this you should be
# safe.
# - Blinks the blue LED (GPIO2) for every received pulse.
@ramonsmits
ramonsmits / XDocumentPreserve.cs
Created September 2, 2022 11:15
XDocument read/write that preserves BOM, line ending and whitespace
//
// Preserves:
//
// - Whitespace (`LoadOptions.PreserveWhitespace`)
// - BOM (passing `UTF8Encoding(false)` ensures reader.Encoding will use this encoding, if BOM is present reader will swap to UTF8Encoding(true))
// - Line endings (using StreamReader instead of passing filename preserves line endings in document)
// - XML declaration header
//
var path = ""; // Path to XML file
@ramonsmits
ramonsmits / NaturalComparer.cs
Created August 30, 2022 08:46
NaturalComparer to compare string with numerics
//
// Based on https://stackoverflow.com/a/5641272/199551
//
public class NaturalComparer : IComparer<string>
{
public static readonly NaturalComparer Instance = new NaturalComparer();
private NaturalComparer() { }
public int Compare(string x, string y)
@ramonsmits
ramonsmits / GuidUtility.cs
Last active July 6, 2022 09:18
GuidUtility
// Source: https://github.com/LogosBible/Logos.Utility/blob/master/src/Logos.Utility/GuidUtility.cs
using System;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// Helper methods for working with <see cref="Guid"/>.
/// </summary>
static class GuidUtility
{
@ramonsmits
ramonsmits / CheckSizeBehavior.cs
Created June 16, 2022 15:59
NServiceBus 7 - Behavior that validates if the serialized body does not exceed a configurable limit
//
// Usage:
//
// var endpointConfiguration = new EndpointConfiguration("MyEndpoint")
// ...
// endpointConfiguration.Pipeline.Register(new CheckSizeBehavior(CheckSizeBehavior.StandardTierMaxSize), nameof(CheckSizeBehavior));
//
using NServiceBus.Pipeline;
class CheckSizeBehavior : IBehavior<IOutgoingPhysicalMessageContext, IOutgoingPhysicalMessageContext>
@ramonsmits
ramonsmits / uptime.cs
Created July 7, 2017 14:41
Get Windows uptime with c#
var uptimeInSeconds = Stopwatch.GetTimestamp() / Stopwatch.Frequency;
var uptime = TimeSpan.FromSeconds(uptimeInSeconds);
Console.WriteLine(uptime);
@ramonsmits
ramonsmits / ValidateDestinationExistsBehavior.cs
Last active June 15, 2022 14:14
NServiceBus 7 - Validate if the Azure Service Bus unicast destination exists
// Usage:
//
// var endpointConfiguration = new EndpointConfiguration("MyEndpoint")
// ...
// var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus_ConnectionString");
// var managementClient = new ManagementClient(connectionString);
// endpointConfiguration.Pipeline.Register(new ValidateDestinationExistsBehavior (managementClient), nameof(ValidateDestinationExistsBehavior));
//
using Microsoft.Azure.ServiceBus.Management;
using NServiceBus.Pipeline;